#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>

// 函数声明
void execute_ls();
void create_file();
void execute_ping();
void execute_vi();
void simulate_yum();
void run_exe();
void show_help();

int main() {
    char command[100];
    int running = 1;
    
    printf("欢迎使用 Linux 命令模拟器 (Windows 版)\n");
    printf("输入 'help' 查看支持的命令\n");
    
    while (running) {
        printf("\n$ ");
        fgets(command, sizeof(command), stdin);
        command[strcspn(command, "\n")] = 0;  // 移除换行符
        
        // 解析命令
        if (strcmp(command, "ls") == 0) {
            execute_ls();
        } else if (strcmp(command, "touch") == 0) {
            create_file();
        } else if (strncmp(command, "ping ", 5) == 0) {
            execute_ping(command + 5);
        } else if (strcmp(command, "vi") == 0) {
            execute_vi();
        } else if (strncmp(command, "yum install ", 12) == 0) {
            simulate_yum(command + 12);
        } else if (strncmp(command, "run ", 4) == 0) {
            run_exe(command + 4);
        } else if (strcmp(command, "help") == 0) {
            show_help();
        } else if (strcmp(command, "exit") == 0) {
            running = 0;
        } else {
            printf("未知命令: %s\n", command);
        }
    }
    
    return 0;
}

// 模拟ls命令 (Windows下使用dir)
void execute_ls() {
    system("dir /B");
}

// 创建文件 (Windows下使用type nul >)
void create_file() {
    char filename[50];
    printf("输入文件名: ");
    scanf("%s", filename);
    getchar();  // 消耗掉scanf留下的换行符
    
    char command[100];
    sprintf(command, "type nul > %s", filename);
    system(command);
    
    printf("文件 '%s' 已创建\n", filename);
}

// 模拟ping命令
void execute_ping(char *host) {
    char command[100];
    sprintf(command, "ping %s", host);
    system(command);
}

// 模拟vi编辑器 (使用Windows记事本)
void execute_vi() {
    char filename[50];
    printf("输入要编辑的文件名: ");
    scanf("%s", filename);
    getchar();  // 消耗掉scanf留下的换行符
    
    char command[100];
    sprintf(command, "notepad %s", filename);
    system(command);
}

// 模拟yum下载 (在Windows下无法真正实现)
void simulate_yum(char *package) {
    printf("警告: 在Windows上无法真正执行yum\n");
    printf("正在模拟下载 %s...\n", package);
    
    // 模拟下载进度
    for (int i = 0; i <= 100; i += 10) {
        printf("\r下载进度: %d%% [", i);
        for (int j = 0; j < i / 10; j++) {
            printf("=");
        }
        for (int j = i / 10; j < 10; j++) {
            printf(" ");
        }
        printf("]");
        fflush(stdout);
        Sleep(200);  // 暂停200毫秒
    }
    printf("\n");
    
    // 检查是否是已知的Windows程序
    if (strcmp(package, "notepad") == 0 || 
        strcmp(package, "calc") == 0 || 
        strcmp(package, "mspaint") == 0) {
        
        printf("下载完成: %s (Windows内置程序)\n", package);
        printf("提示: 使用 'run %s' 运行\n", package);
    } else {
        printf("下载完成: %s (已保存为 %s.exe)\n", package, package);
        printf("警告: 这只是模拟下载，%s.exe 可能无法在Windows上运行\n", package);
        printf("提示: 使用 'run %s.exe' 尝试运行\n", package);
    }
}

// 运行exe文件
void run_exe(char *exe_file) {
    char command[100];
    sprintf(command, "start %s", exe_file);
    
    printf("尝试运行 %s...\n", exe_file);
    if (system(command) != 0) {
        printf("错误: 无法运行 %s\n", exe_file);
        printf("提示: 确保文件存在且是有效的Windows可执行文件 (.exe)\n");
    }
}

// 显示帮助信息
void show_help() {
    printf("\n支持的命令:\n");
    printf("  ls             - 显示当前目录文件列表\n");
    printf("  touch          - 创建新文件\n");
    printf("  ping [主机名]  - 测试网络连接\n");
    printf("  vi             - 编辑文件 (使用记事本)\n");
    printf("  yum install    - 模拟安装软件包\n");
    printf("  run [程序名]   - 运行Windows程序\n");
    printf("  help           - 显示此帮助信息\n");
    printf("  exit           - 退出程序\n");
}